热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

知名企业|推广性_基于Springboot+Vue实现前后端分离进销存管理系统

篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于Springboot+Vue实现前后端分离进销存管理系统相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于Springboot+Vue实现前后端分离进销存管理系统相关的知识,希望对你有一定的参考价值。




作者主页:编程指南针


作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师


主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助


文末获取源码 


项目编号:BS-XX-144


引言:


目前整个社会已经进入到一个商品异常丰富的商品时代,商业化的高度发展也加速了商品流通的速度,很多的生产企业和商贸公司也遍地开花似的蓬勃发展起来了。而如何去有效的管理这些琳琅满目的商品的采购、销售、库存信息,是面临的一大难题,传统的靠人工去管理的方式即效率低下,又容易出错,造成损耗,还无法及时统计信息。在当今信息化技术普遍应用的今天,如何利用信息化和数字化去管理商品的进销存信息,是一个值得研究的问题。

本次经过调研走访开发设计的这套进销存管理系统,它的设计与开发主要基于Java开发语言平台,采用Spring 全家桶技术中的轻量级Springboot框架技术,并结合JPA第三方持久层框架开发实现,前端页面使用ElementsUI进行页面的开发布局,并同时使用了Vue等前端技术进行页面美化和图形报表开发。进销存系统的业务数据存储则使用mysql8数据库。系统使用Tomcat8.5.31来部署运行。

这套进销存管理系统的开发主要是采用产品设计开发的思路去做,尽量做的功能具有普遍适用性,经过走访调查,得出大多数商家的基本功能需求进而进行抽取整合,开发实现了这套进销存管理系统,它具有一定的社会推广性,对整个社会的商业化进行有着广泛而积极的意义。


一,项目简介

基于SpringBoot+Vue实现的一个比较全面的进销存管理系统。系统整体功能比较强大,操作人机交互性比较好,无论是从开发模式还是易用性和技术,都是比较优秀的一个项目,适合有些难度或要求较高的毕业设计项目使用。系统有着完备的权限管理控制,可以自行定义角色和用户并自由分配权限,不同的角色用户进入系统拥有的操作权限也不相同。主要完成的功能 有:


  1. 用户注册登陆
  2. 首页仪表盘信息统计功能
  3. 图形报表统计展示功能
  4. 系统管理模块
    1. 部门管理
    2. 用户管理
    3. 菜单管理
    4. 角色管理
    5. 商品分类管理
    6. 供应商管理
    7. 客户管理
  5. 采购管理模块
    1. 采购订单管理模块
    2. 采购入库管理模块
  6. 销售管理模块
    1. 销售订单管理模块
    2. 销售出库管理模块
  7. 库存管理模块
  8. 消息中心模块

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql8   Redis:redis5.0

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Springboot+Mybatis-plus

前端开发技术:Nodejs+Vue+ElemenetUI

第三方技术:七牛云



三,系统展示

用户登陆

首页统计

消息管理

个人消息

采购订单

采购入库

销售订单

销售出库

库存管理

部门管理

菜单管理

角色管理

用户管理

商品分类管理

客户管理

供应商管理


四,核心代码展示

package cn.toesbieya.jxc.controller;
import cn.toesbieya.jxc.model.vo.LoginParam;
import cn.toesbieya.jxc.model.vo.PasswordUpdateParam;
import cn.toesbieya.jxc.model.vo.RegisterParam;
import cn.toesbieya.jxc.model.vo.UserVo;
import cn.toesbieya.jxc.service.AccountService;
import cn.toesbieya.jxc.util.SessionUtil;
import cn.toesbieya.jxc.util.IpUtil;
import cn.toesbieya.jxc.model.vo.R;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
@RestController
@RequestMapping("account")
public class AccountController
@Resource
private AccountService service;
@PostMapping("login")
public R login(HttpServletRequest request, @Valid @RequestBody LoginParam param)
return service.login(param, IpUtil.getIp(request));

@GetMapping("logout")
public R logout(HttpServletRequest request)
UserVo user = SessionUtil.get(request);
return service.logout(user, IpUtil.getIp(request));

@PostMapping("register")
public R register(@Valid @RequestBody RegisterParam param)
return service.register(param);

@PostMapping("updatePwd")
public R updatePwd(@RequestBody PasswordUpdateParam param)
UserVo user = SessionUtil.get();
param.setId(user.getId());
String errMsg = validateUpdatePwdParam(param);
if (errMsg != null) return R.fail(errMsg);
return service.updatePwd(param);

@GetMapping("updateAvatar")
public R updateAvatar(@RequestParam String key) throws UnsupportedEncodingException
if (StringUtils.isEmpty(key)) return R.fail("参数错误");
return service.updateAvatar(SessionUtil.get(), URLDecoder.decode(key, "utf-8"));

@GetMapping("validate")
public R validate(@RequestParam String pwd)
UserVo current = SessionUtil.get();
if (!pwd.equals(current.getPwd()))
return R.fail("校验失败");

return R.success("校验通过");

@GetMapping("checkLoginName")
public R checkLoginName(@RequestParam(required = false) Integer id, @RequestParam String name)
if (StringUtils.isEmpty(name))
return R.success();

return R.success(service.isLoginNameExist(name, id) ? "该登录名已存在" : null);

@GetMapping("checkNickName")
public R checkNickName(@RequestParam(required = false) Integer id, @RequestParam String name)
if (StringUtils.isEmpty(name))
return R.success();

return R.success(service.isNickNameExist(name, id) ? "该昵称已存在" : null);

private String validateUpdatePwdParam(PasswordUpdateParam vo)
if (vo.getId() == null) return "修改失败,参数错误";
if (StringUtils.isEmpty(vo.getOldPwd())) return "修改失败,原密码不能为空";
if (StringUtils.isEmpty(vo.getNewPwd())) return "修改失败,新密码不能为空";
if (vo.getOldPwd().equals(vo.getNewPwd())) return "修改失败,新密码不得与旧密码相同";
if (vo.getNewPwd().length() != 32) return "修改失败,密码参数有误";
return null;

package cn.toesbieya.jxc.controller;
import cn.toesbieya.jxc.model.vo.search.StockSearch;
import cn.toesbieya.jxc.service.BizStockService;
import cn.toesbieya.jxc.model.vo.R;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("stock/current")
public class BizStockController
@Resource
private BizStockService service;
@PostMapping("search")
public R search(@RequestBody StockSearch vo)
return R.success(service.search(vo));

@GetMapping("getDetail")
public R getDetail(@RequestParam String cids)
if (StringUtils.isEmpty(cids)) return R.fail("参数错误");
return R.success(service.getDetail(cids));

@GetMapping("getDetailById")
public R getDetailById(@RequestParam String ids)
if (StringUtils.isEmpty(ids)) return R.fail("参数错误");
return R.success(service.getDetailById(ids));

@PostMapping("export")
public void export(@RequestBody StockSearch vo, HttpServletResponse response) throws Exception
service.export(vo, response);

package cn.toesbieya.jxc.controller.sys;
import cn.toesbieya.jxc.model.entity.SysCategory;
import cn.toesbieya.jxc.model.vo.search.CategorySearch;
import cn.toesbieya.jxc.service.sys.SysCategoryService;
import cn.toesbieya.jxc.model.vo.R;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("system/category")
public class CategoryController
@Resource
private SysCategoryService service;
@GetMapping("getAll")
public R getAll()
return R.success(service.getAll());

@PostMapping("search")
public R search(@RequestBody CategorySearch vo)
return R.success(service.search(vo));

@PostMapping("add")
public R add(@RequestBody SysCategory category)
String errMsg = validateCategoryCreateParam(category);
if (errMsg != null) return R.fail(errMsg);
category.setId(null);
category.setCtime(System.currentTimeMillis());
return service.add(category);

@PostMapping("update")
public R update(@RequestBody SysCategory category)
String errMsg = validateCategoryUpdateParam(category);
if (errMsg != null) return R.fail(errMsg);
return service.update(category);

@PostMapping("del")
public R del(@RequestBody SysCategory category)
if (category.getId() == null) return R.fail("删除失败,参数错误");
return service.del(category);

private String validateCategoryCreateParam(SysCategory category)
if (category.getPid() == null) return "创建失败,参数错误";
if (StringUtils.isEmpty(category.getName())) return "创建失败,分类名称不能为空";
return null;

private String validateCategoryUpdateParam(SysCategory category)
if (category.getId() == null) return "修改失败,参数错误";
if (category.getPid() == null) return "创建失败,参数错误";
if (StringUtils.isEmpty(category.getName())) return "创建失败,分类名称不能为空";
return null;


package cn.toesbieya.jxc.controller.sys;
import cn.toesbieya.jxc.model.entity.SysCustomer;
import cn.toesbieya.jxc.model.vo.search.CustomerSearch;
import cn.toesbieya.jxc.service.sys.SysCustomerService;
import cn.toesbieya.jxc.model.vo.R;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("system/customer")
public class CustomerController
@Resource
private SysCustomerService service;
@GetMapping("getLimitRegion")
public R getLimitRegion()
return R.success(service.getLimitRegion());

@PostMapping("search")
public R search(@RequestBody CustomerSearch vo)
return R.success(service.search(vo));

@PostMapping("add")
public R add(@RequestBody SysCustomer customer)
String errMsg = validateCreateParam(customer);
if (errMsg != null) return R.fail("创建失败," + errMsg);
customer.setId(null);
customer.setCtime(System.currentTimeMillis());
return service.add(customer);

@PostMapping("update")
public R update(@RequestBody SysCustomer customer)
String errMsg = validateUpdateParam(customer);
if (errMsg != null) return R.fail("修改失败," + errMsg);
return service.update(customer);

@PostMapping("del")
public R del(@RequestBody SysCustomer customer)
if (customer.getId() == null) return R.fail("删除失败,参数错误");
return service.del(customer);

private String validateCreateParam(SysCustomer customer)
if (StringUtils.isEmpty(customer.getName())) return "客户名称不能为空";
if (StringUtils.isEmpty(customer.getRegion())) return "客户行政区域不能为空";
if (StringUtils.isEmpty(customer.getAddress())) return "客户地址不能为空";
if (StringUtils.isEmpty(customer.getLinkman())) return "客户联系人不能为空";
if (StringUtils.isEmpty(customer.getLinkphone())) return "客户联系电话不能为空";
return null;

private String validateUpdateParam(SysCustomer customer)
if (customer.getId() == null) return "参数错误";
return validateCreateParam(customer);

package cn.toesbieya.jxc.controller.sys;
import cn.toesbieya.jxc.model.entity.RecUserAction;
import cn.toesbieya.jxc.model.entity.SysUser;
import cn.toesbieya.jxc.model.vo.search.UserSearch;
import cn.toesbieya.jxc.util.ThreadUtil;
import cn.toesbieya.jxc.service.sys.SysUserService;
import cn.toesbieya.jxc.model.vo.R;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
@RestController("sysUserController")
@RequestMapping("system/user")
public class UserController
@Resource
private SysUserService service;
@PostMapping("search")
public R search(@RequestBody UserSearch vo)
return R.success(service.search(vo));

@PostMapping("add")
public R add(@RequestBody SysUser user)
String errMsg = validateUserCreateParam(user);
if (errMsg != null)
return R.fail(errMsg);

return service.add(user);

@PostMapping("update")
public R update(@RequestBody SysUser user)
String errMsg = validateUserUpdateParam(user);
if (errMsg != null)
return R.fail(errMsg);

return service.update(user);

@PostMapping("del")
public R del(@RequestBody SysUser user)
if (user.getId() == null)
return R.fail("删除失败");

return service.del(user);

@PostMapping("kick")
public R kick(@RequestBody List users)
if (users == null || users.isEmpty())
return R.fail("参数错误");

RecUserAction action = ThreadUtil.getAction();
List names = users.stream().map(SysUser::getLoginName).collect(Collectors.toList());
action.setAction("踢出用户:【" + String.join(",", names) + "】");
return service.kick(users);

@PostMapping("resetPwd")
public R resetPwd(@RequestBody SysUser user)
if (user.getId() == null || StringUtils.isEmpty(user.getLoginName()))
return R.fail("参数错误");

return service.resetPwd(user);

private String validateUserCreateParam(SysUser user)
if (user.getId() != null) return "创建失败,参数错误";
if (StringUtils.isEmpty(user.getLoginName())
||StringUtils.isEmpty(user.getNickName()))
return "创建失败,用户名称不能为空";

if (user.getRole() == null) return "创建失败,用户角色不能为空";
return null;

private String validateUserUpdateParam(SysUser user)
if (user.getId() == null) return "修改失败,参数错误";
if (StringUtils.isEmpty(user.getLoginName())
||StringUtils.isEmpty(user.getNickName()))
return "创建失败,用户名称不能为空";

if (user.getRole() == null) return "修改失败,用户角色不能为空";
return null;



五,项目总结

数字化和信息化是近年来各行业的发展趋势。各种规模的公司正在迅速崛起。许多从事生产经营管理的企业都有自己的产品生产和销售,其中有代表性的就是各大超市与食品工厂。这些超市和工厂的食品需要存放在仓库中。对于每个超市和工厂来说,随着规模的不断扩大和产品数量的急剧增加,产品的种类将不断更新和发展,关于产品的信息量也将成倍增长。面对海量的产品信息,如何有效地管理库存产品对这些超市和工厂来说非常重要。仓库管理的重点是销售信息能否及时反馈,从而保证超市和工厂的运营效率。在当今的数字时代,为了加快仓库管理员的管理,我们必须依靠计算机,使货物数据的管理更加简单和到位。基于以上原因,迫切需要开发一套进销存管理系统。本文是基于计算机对仓库中的大量数据进行处理和处理的研究。

进销存管理涉及产品进出仓库、销售人员和客户等各个方面。如何管理这些信息数据是一项复杂的系统工程,它充分考验着仓库管理员的工作能力。可以想象,工作量很重。因此,需要设计出一套进销存管理系统来提高库存管理的效率,这对于规范管理、数据统计、快速查询信息、减少管理工作量、调动员工积极性、提高生产效率具有重要的现实意义。

在我国,从二十世纪七十年代计算机得以应用后,国内企业才逐渐配合该技术产生相应进销存管理应用,然而受当时软硬件水平局限该类系统也仅支持完成那些较简单性的管理操作。直到八十年代,沈阳一家鼓风机厂率先引进COPICS系统(由IBM公司开发)才打破此种僵局,拉开在我国畜牧业应用MRPII系统的序幕[10]。

到上世纪末,受计算机技术发展及863计划双重影响,我国大量企业开始引进使用外国先进系统来完善自身企业管理。

    本世纪以来,在我国实施信息化带动工业化政策响应下,更多外国先进知名企业开始青睐我国市场,在我国加设办事处。不仅增大了我国市场还激发了国有化产品的研发.进度,也给我国进销存管理应用软件行业带来了新的契机促进其高速发展。一时之间我国的联想、华为等许多知名企业基于其所引进的外国先进软件结合自身实际情况与市.场需要,开发出了许多更加适合我国实际问题的应用商品,并在推出后取得极好的市场反映。


推荐阅读
  • 本文精选了几个结合 Vue 和 Spring Boot 的优质开源项目,适合开发者学习和参考。这些项目不仅涵盖了前后端分离的最佳实践,还提供了丰富的功能示例和详细的文档,有助于提升开发效率和技术水平。项目地址:https://github.com/ 示例链接。 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 如何正确配置与使用日志组件:Log4j、SLF4J及Logback的连接与整合方法
    在当前的软件开发实践中,无论是开源项目还是日常工作中,日志框架都是不可或缺的工具之一。本文详细探讨了如何正确配置与使用Log4j、SLF4J及Logback这三个流行的日志组件,并深入解析了它们之间的连接与整合方法,旨在帮助开发者高效地管理和优化日志记录流程。 ... [详细]
  • 如何在Oracle ASM_Diskgroup中重命名现有磁盘
    如何在Oracle ASM_Diskgroup中重命名现有磁盘 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 智能制造数据综合分析与应用解决方案
    在智能制造领域,生产数据通过先进的采集设备收集,并利用时序数据库或关系型数据库进行高效存储。这些数据经过处理后,通过可视化数据大屏呈现,为生产车间、生产控制中心以及管理层提供实时、精准的信息支持,助力不同应用场景下的决策优化和效率提升。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 从用户转型为开发者:一场思维升级的旅程 | 专访 StarRocks Committer 周威
    从用户转变为开发者,不仅是一次角色的转换,更是一场深刻的思维升级之旅。本次专访中,StarRocks Committer 周威分享了他如何在这一过程中逐步提升技术能力与思维方式,为开源社区贡献自己的力量。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 在Spring框架中,基于Schema的异常通知与环绕通知的实现方法具有重要的实践价值。首先,对于异常通知,需要创建一个实现ThrowsAdvice接口的通知类。尽管ThrowsAdvice接口本身不包含任何方法,但开发者需自定义方法来处理异常情况。此外,环绕通知则通过实现MethodInterceptor接口来实现,允许在方法调用前后执行特定逻辑,从而增强功能或进行必要的控制。这两种通知机制的结合使用,能够有效提升应用程序的健壮性和灵活性。 ... [详细]
  • SpringBoot启动脚本详解:BAT文件应用与基础入门指南(SpringBoot系列第1篇)
    如果你还在为SSM框架的复杂搭建过程和繁琐的配置文件而烦恼,那么SpringBoot将是你的一大福音。作为SpringBoot系列的第一篇文章,本文详细介绍了如何使用BAT文件来启动SpringBoot应用,并提供了基础入门指南,帮助开发者快速上手,简化开发流程。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 手机上编写和运行PHP代码的最佳软件推荐 ... [详细]
author-avatar
丿虚伪丿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有